package logic

import (
	da "admin/dao/auth"
	"admin/dto"
	m "admin/models/auth"
	"admin/utils/encryption"
	"admin/utils/pagination"
	"errors"
)

// AdminUserLogic 管理员用户业务逻辑
type AdminUserLogic struct {
	userRepoInterface     da.AdminUserInterface
	userRoleRepoInterface da.UserRoleInterface
}

// NewAdminUserLogic 创建新的管理员用户逻辑实例
// repo: 管理员用户仓库实例
// 返回值: 管理员用户逻辑实例指针
func NewAdminUserLogic(userRepoInterface da.AdminUserInterface, userRoleRepoInterface da.UserRoleInterface) *AdminUserLogic {
	// 使用GORM实现的管理员用户仓库初始化逻辑实例
	return &AdminUserLogic{
		userRepoInterface:     userRepoInterface,
		userRoleRepoInterface: userRoleRepoInterface,
	}
}

// List 获取管理员用户列表
// 返回值: 管理员用户列表和错误信息
func (l *AdminUserLogic) List(req dto.ListAdminUserReq) (*pagination.PageResult[m.AdminUser], error) {
	return l.userRepoInterface.List(req)
}

// Create 创建管理员用户
// username: 用户名
// password: 密码
// 返回值: 错误信息
func (l *AdminUserLogic) Create(username, password string) error {
	// 检查用户名是否为空
	if username == "" {
		return errors.New("用户名不能为空")
	}
	// 检查密码是否为空
	if password == "" {
		return errors.New("密码不能为空")
	}

	// 对密码进行加密
	hashedPassword, err := encryption.HashPassword(password)
	if err != nil {
		return errors.New("密码加密失败")
	}

	// 调用仓库层创建用户
	return l.userRepoInterface.Create(&m.AdminUser{Username: username, Password: hashedPassword})
}

// Update 更新管理员用户
// id: 用户ID
// username: 新用户名
// 返回值: 错误信息
func (l *AdminUserLogic) Update(id int64, req dto.UpdateAdminUserReq) error {
	// 检查用户ID是否有效
	if id == 0 {
		return errors.New("用户ID不能为空")
	}
	// 处理表单数据
	username := req.Username
	password := req.Password

	// 检查用户名是否为空
	if username == "" {
		return errors.New("用户名不能为空")
	}
	// 检查密码是否为空
	if password != "" {
		// 对密码进行加密
		hashedPassword, err := encryption.HashPassword(password)
		if err != nil {
			return errors.New("密码加密失败")
		}
		// 更新密码
		return l.userRepoInterface.Update(&m.AdminUser{ID: id, Username: username, Password: hashedPassword})
	}

	// 调用仓库层更新用户
	return l.userRepoInterface.Update(&m.AdminUser{ID: id, Username: username})
}

// Delete 删除管理员用户
// id: 用户ID
// 返回值: 错误信息
func (l *AdminUserLogic) Delete(id int64) error {
	// 检查用户ID是否有效
	if id == 0 {
		return errors.New("用户ID不能为空")
	}
	// 调用仓库层删除用户
	return l.userRepoInterface.Delete(id)
}

// AddRoleToUser 给用户添加角色
// userID: 用户ID
// roleID: 角色ID
// db: 数据库连接
// 返回值: 错误信息
func (l *AdminUserLogic) AddRoleToUser(userID, roleID int64) error {
	// 检查用户ID是否有效
	if userID == 0 {
		return errors.New("用户ID不能为空")
	}
	// 检查角色ID是否有效
	if roleID == 0 {
		return errors.New("角色ID不能为空")
	}

	// 调用仓库层添加用户角色关联
	return l.userRoleRepoInterface.AddRoleToUser(userID, roleID)
}

// RemoveRoleFromUser 移除用户的角色
// userID: 用户ID
// roleID: 角色ID
// db: 数据库连接
// 返回值: 错误信息
func (l *AdminUserLogic) RemoveRoleFromUser(userID, roleID int64) error {
	// 检查用户ID是否有效
	if userID == 0 {
		return errors.New("用户ID不能为空")
	}
	// 检查角色ID是否有效
	if roleID == 0 {
		return errors.New("角色ID不能为空")
	}

	// 调用仓库层移除用户角色关联
	return l.userRoleRepoInterface.RemoveRoleFromUser(userID, roleID)
}

// GetRolesByUser 获取用户的所有角色
// userID: 用户ID
// db: 数据库连接
// 返回值: 角色列表和错误信息
func (l *AdminUserLogic) GetRolesByUser(userID int64) ([]m.Role, error) {
	// 检查用户ID是否有效
	if userID == 0 {
		return nil, errors.New("用户ID不能为空")
	}
	// 调用仓库层获取用户角色列表
	return l.userRoleRepoInterface.GetRolesByUser(userID)
}
